package com.findyou.controller;

import com.findyou.pojo.QueryVo;
import com.findyou.pojo.User;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Date;

/**
 * @Title: UserController
 * @Author 贾金博
 * @Package com.findyou.controller
 * @Date 2024/12/8 上午10:31
 * @description: 用户前端控制器
 */

@Controller
@RequestMapping("/user")
@SessionAttributes("username") //向request域存入的key为username时，同步到session域中
public class UserController {

    /**
     * 接收的是前端的get请求 没有携带参数
     * @return
     */
    @RequestMapping("/quick")
    public String quick() {
        // 业务逻辑的处理
        System.out.println("this is controller");
        // success为逻辑视图
        return "success";
    }

    /**
     * 接收的是前端传来的 对象类型
     * @param user
     * @return
     */
    @RequestMapping("/pojoParam")
    public String pojoParam(User user) {
        System.out.println("this is pojoParam");
        System.out.println(user);
        return "success";
    }

    /**
     * 接收前端传来的数组类型
     * @param ids
     * @return
     */
    @RequestMapping("/arrayParam")
    public String arrayParam(@RequestParam(name = "ids") Integer[] ids) {
        System.out.println(Arrays.toString(ids));
        return "success";
    }

    /**
     * 接收前端的复杂对象
     * @param queryVo
     * @return
     */
    @RequestMapping(value = "/queryParam", method = RequestMethod.POST)
    public String queryParam(QueryVo queryVo) {
        System.out.println(queryVo);
        return "success";
    }

    /**
     * 对日期的处理 在这里用的是注解的形式: @DateTimeFormat 里面的pattern进行了格式的限制
     * @param birthday
     * @return
     */
    @RequestMapping("/converterParam")
    public String converterParam(@RequestParam(name = "birthday") @DateTimeFormat(pattern = "yyyy-MM-dd") Date birthday) {
        System.out.println(birthday);
        return "success";
    }

    /**
     * 获取请求头的数据
     * @param cookie
     * @return
     */
    @RequestMapping("/requestHead")
    public String requestHead(@RequestHeader("cookie") String cookie) {
        System.out.println("This is cookie");
        return "success";
    }

    /**
     * 获取cookie中的数据
     * @param jesessionId
     * @return
     */
    @RequestMapping("/cookieValue")
    public String cookieValue(@CookieValue("JSESSIONID") String jesessionId) {
        System.out.println("Id = " + jesessionId);
        return "success";
    }


    /**
     * 获取Servlet相关的API
     * @param request
     * @param response
     * @param session
     * @return
     */
    @RequestMapping("/servletAPI")
    public String servletAPI(HttpServletRequest request, HttpServletResponse
            response, HttpSession session) {
        System.out.println(request);
        System.out.println(response);
        System.out.println(session);
        return "success";
    }


    /**
     * 用request和response对象实现响应
     * @param request
     * @param response
     */
    @RequestMapping("/returnVoid")
    public void returnVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("this is returnVoid");

       /* // 方式一通过response直接响应数据
        response.setContentType("text/html;charset=utf-8");
        // 下面写的是你要写的是什么数据
        try {
            response.getWriter().write("I'm FindYou, Who you are?");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }*/


        // 方式二 通过request实现转发
        /*request.setAttribute("username", "FindYou");
        request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response);*/


        // 方式三 通过response实现重定向
        response.sendRedirect(request.getContextPath() + "/index.jsp");
    }

    /**
     * 用 forward进行转发 转发是请求一次 也即是不改变url
     * @param model
     * @return
     */
    @RequestMapping("/forward")
    public String forward(Model model) {
        model.addAttribute("username", "FindYou");
        return "forward:/index.jsp";
    }

    /**
     * 重定向 用 redirect关键字 重定向的请求是两次 改变url的
     * 但是我通过这个model并没有拿到这个username 它的底层好像是 request 去实现的
     * @param model
     * @return
     */
    @RequestMapping("/redirect")
    public String redirect(Model model) {
        model.addAttribute("username", "FindYou");
        return "redirect:/index.jsp";
    }


    /**
     * 通过ModelAndView 自己去动手去实现 更加的底层了
     * @return
     */
    @RequestMapping("/returnModelAndView")
    public ModelAndView returnModelAndView() { // 当然这里也是可以去通过去形参 ModelAndView的 可以不用去咱们自己new了
        /*
        Model:模型 作用封装数据
        View：视图 作用展示数据
        */
        ModelAndView modelAndView = new ModelAndView();
        //设置模型数据
        modelAndView.addObject("username", "FindYou");
        //设置视图名称
        modelAndView.setViewName("success");
        return modelAndView;
    }


    /**
     * 自己去创建一个页面 返回的是一个字符串
     * @param request
     * @param response
     * @throws IOException
     */
    @RequestMapping("/returnString")
    public void returnString(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 1.通过response直接响应数据
        response.setContentType("text/html;charset=utf-8"); // 说明返回的是一个html 自己写的
        response.getWriter().write("<h1>This is FindYou</h1>"); // 当然这里也是可以去自己加标签的
    }


    /**
     * 返回的是JSON数据 要加上@ResponseBody 别忘了jar包的导入
     * @return
     */
    @ResponseBody
    @RequestMapping("/returnJSON")
    public User returnJSON() {
        User user = new User(1, "FindYou");
        return user;
    }


}
